package com.cskaoyan.javase._2variable._3notice;

/**
 * 变量使用过程中问题1: 浮点数的精度问题
 * 主要原因有两个:
 *      1.浮点数有 有效位数的限制
 *      2.二进制表示小数会出现循环的情况
 *
 * 二进制表示0.1
 * 这里涉及一个二进制表示小数的转换问题，规则如下：
 * 十进制正小数（0.开头）转换成二进制，先用小数部分乘以2，取结果的整数部分(必然是1或者0)，
 * 然后小数部分继续乘2
 * 直到小数部分为0，或者已经达到了最大的位数
 * 最终的结果（0.开头）正序排列
 *
 * 0.1 * 2 = 0.2 ---> 0
 * 0.2 * 2 = 0.4 ---> 0
 * 0.4 * 2 = 0.8 ---> 0
 * 0.8 * 2 = 1.6 ---> 1
 * 0.6 * 2 = 1.2 ---> 1
 * 0.2 * 2 = 0.4 ---> 0
 * ...
 * 显然这个循环不可能停下来,也就是说用二进制表示小数0.1是一个无限循环小数
 *
 * 以上浮点数是有精度问题的
 *
 * @since 16:00
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        System.out.println(1 - 0.9);
        System.out.println(1 - 0.9F);

        float a = 0.1F;
        float b = 0.10000000000000000001F; //中间18个0
        System.out.println(a == b);


        long c = 10;

        // Incompatible types. Found: 'double', required: 'float'
        // float d = 0.1;
    }
}
